package ar.uade.distribuidas.tpo.dao;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.LinkedList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import ar.uade.distribuidas.tpo.base.dominiodto.ClienteDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemSolicitudDeCotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RodamientoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.SolicitudDeCotizacionDTO;
import ar.uade.distribuidas.tpo.base.remoto.IGestionCliente;



public class SolicitudDeCotizacionXmlDao {
	
	private static SolicitudDeCotizacionXmlDao instance;

	private Document doc;
	//private static final String FILE_NAME = "solicitud-de-cotizacion.xml";
	
	public static SolicitudDeCotizacionXmlDao getInstance(String nombArch){
		if(instance == null){
			instance = new SolicitudDeCotizacionXmlDao();
			instance.createDocument(nombArch);
		}
		return instance;
	}
	
	private SolicitudDeCotizacionXmlDao() {}

	private void createDocument(String fileName){
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			doc = builder.parse(fileName+".xml");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//FIXME return list
	public SolicitudDeCotizacionDTO getSolicitudDeCotizacion(){
		List<SolicitudDeCotizacionDTO> scs = new LinkedList<>();
		NodeList nodos = doc.getElementsByTagName("SolicitudCotizacion");
		
		for(int i = 0; i < nodos.getLength(); i++){
				scs.add(mapSolicitudDeCotizacion((Element)nodos.item(i)));
		}
		
		return scs.get(0);
	}

	private SolicitudDeCotizacionDTO mapSolicitudDeCotizacion(Element solicitudDeCotizacionXml) {

		
		int id = Integer.parseInt(solicitudDeCotizacionXml.getAttribute("numero"));
		String fechaXml = solicitudDeCotizacionXml.getAttribute("fecha");
		//LocalDate fecha = LocalDate.parse(fechaXml, FormatUtils.DATE_FORMATTER);

		Element clienteXml = (Element) solicitudDeCotizacionXml.getElementsByTagName("Cliente").item(0);
		Long cuil = Long.parseLong(clienteXml.getElementsByTagName("Cuil").item(0).getTextContent());
		//String nombre = clienteXml.getElementsByTagName("RazonSocial").item(0).getTextContent(); No hace falta, el cliente lo trae
		
		ClienteDTO cliente = null;
		IGestionCliente gestion;
		try {
			gestion = (IGestionCliente) Naming.lookup("GestionCliente");
			cliente = gestion.getCliente(cuil);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
		Element rodamientoXml = (Element) solicitudDeCotizacionXml.getElementsByTagName("Rodamientos").item(0);
		NodeList itemsXml = rodamientoXml.getElementsByTagName("Item");
		
		SolicitudDeCotizacionDTO sc = new SolicitudDeCotizacionDTO();
		sc.setId(id );
		sc.setFecha(fechaXml);
		sc.setCliente(cliente );
		
		for (int i = 0; i < itemsXml.getLength(); i++) {
			ItemSolicitudDeCotizacionDTO itemCotizacion = this.mapItemCotizacion((Element) itemsXml.item(i));
			sc.getItems().add(itemCotizacion);
		}
				
		return sc;
	}
	
	private ItemSolicitudDeCotizacionDTO mapItemCotizacion(Element itemXml) {
		Long nroSerie = Long.parseLong(itemXml.getAttribute("serie"));
		Integer cantidad = Integer.parseInt(itemXml.getElementsByTagName("Cantidad").item(0).getTextContent());
		String origen = itemXml.getElementsByTagName("Origen").item(0).getTextContent();
		String marca = itemXml.getElementsByTagName("Marca").item(0).getTextContent();
		String sufijo = itemXml.getElementsByTagName("Sufijo").item(0).getTextContent();

		RodamientoDTO rodamiento = new RodamientoDTO();
		rodamiento.setNroSerie(nroSerie);
		rodamiento.setPais(origen);
		rodamiento.setMarca(marca);
		rodamiento.setSufijo(sufijo);
		
		ItemSolicitudDeCotizacionDTO itemCotizacion = new ItemSolicitudDeCotizacionDTO();
		itemCotizacion.setRodamiento(rodamiento);
		itemCotizacion.setCantidad(cantidad);
				
		return itemCotizacion;
	}
	
	public static void main(String[] args) {
		SolicitudDeCotizacionDTO sc = SolicitudDeCotizacionXmlDao.getInstance("solicitud-de-cotizacion").getSolicitudDeCotizacion();
		System.out.println(sc);
	}

}
